跳到主要内容
Cowers://
全部文章
Python

Python 常用标准库速查

整理 random、time、datetime、os、sys、json 等常用标准库的核心用法与易错点。

1. random —— 随机模块

方法 作用 备注
random.random() 生成 [0, 1) 的浮点数
random.randint(a, b) 生成 [a, b] 的整数 两端都包含(与 Java 的 Random.nextInt 不同)
random.choice(seq) 随机取 1 个元素
random.sample(seq, n) 随机取 n 个元素 返回新列表,不重复抽取
random.shuffle(l) 原地打乱 无返回值,只能作用于可变类型(如 list)
import random
l = [1, 2, 3, 4, 5]
random.shuffle(l)   # 原地打乱,返回 None
print(l)

WARNING 易错点 random.shuffle() 是原地操作,写 l = random.shuffle(l) 会把 l 变成 None


2. time 模块

import time
time.time()               # 当前时间戳(float,秒)
time.localtime()          # 当前本地时间(struct_time,可取 .tm_year 等属性)
time.localtime(1782978205)  # 时间戳 → 本地时间
time.gmtime(1782978205)     # 时间戳 → UTC 时间(格林尼治)
time.strftime('%Y/%m/%d %H:%M:%S', time.localtime())  # 格式化输出
  • localtime()本地时区转换,gmtime()UTC(0 时区) 转换,两者相差时区偏移。

3. datetime 模块

3.1 datetime 类

import datetime
datetime.datetime.now()                                # 当前时间
datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')  # 格式化
 
# 自定义构造
t = datetime.datetime(year=2020, month=10, day=1,
                      hour=10, minute=10, second=10, microsecond=1000)
t.year                                  # 直接取属性
t.strftime('%Y/%m/%d %H:%M:%S.%f%z')   # %f 微秒,%z 时区

3.2 date 类

datetime.date.today()   # 只有日期,没有时间;不支持 now()

3.3 timedelta —— 时间差

t1 = datetime.datetime(2020, 10, 1, 10, 10, 10)
t2 = datetime.datetime.now()
diff = t2 - t1          # 得到 timedelta 对象(天数 + 秒数)

3.4 relativedelta —— 精确到年/月/日的差值(第三方 dateutil)

from dateutil.relativedelta import relativedelta
t = relativedelta(t2, t1)
print(f'总共相差了{t.years}{t.months}{t.days}天')

TIP timedelta vs relativedelta

  • timedelta:标准库,只表示"总天数 + 秒",没有年、月的概念
  • relativedelta:第三方 dateutil,能拆出年 / 月 / 日的差值,更贴近人类表达

常用格式化占位符

占位符 含义 占位符 含义
%Y 四位年份 %H 时(24 制)
%m %M
%d %S
%f 微秒 %z 时区偏移

4. sys 模块 —— 解释器与脚本控制

4.1 sys.argv —— 命令行参数

python day_31_常用模块.py 1 2 3
import sys
sys.argv        # 列表;argv[0] 永远是脚本名,参数从 argv[1] 开始
if len(sys.argv) > 1:
    print("参数为:", sys.argv[1:])

类比:相当于 Java 的 public static void main(String[] args) 里的 args,只是 Python 把脚本名放在了第 0 位。

4.2 sys.exit() —— 退出脚本

sys.exit(1)   # 立即退出,后续代码不再执行;非 0 表示异常退出

4.3 sys.path —— 模块搜索路径

sys.path                          # 列表,import 时按此查找模块
sys.path.append('D:\\my_project') # 临时添加自定义模块搜索路径
import abcabc                     # 之后就能找到该目录下的模块

4.4 版本信息

sys.version              # 完整版本字符串
sys.version_info         # 具名元组,可比较大小
sys.version_info.major   # 主版本
sys.version_info.minor   # 次版本
sys.version_info.micro   # 小版本
 
# 部署时做版本检查
if sys.version_info < (3, 10, 22):
    sys.exit(1)

5. os 模块 —— 路径与目录操作

5.1 工作目录

os.getcwd()              # 获取当前工作目录(绝对路径)
os.chdir(path)           # 切换工作目录
os.listdir(path)         # 列出目录下的文件/文件夹;不传参 = 当前目录

5.2 创建与删除

操作 方法 限制
创建单级目录 os.mkdir(p) 已存在会报错
递归创建多级目录 os.makedirs(p, exist_ok=True) exist_ok=True 已存在不报错
删除文件 os.remove(f) 只能删文件
删除单个空目录 os.rmdir(p) 非空报错
递归删除空目录 os.removedirs(p) 从子到父逐级删,全程必须为空
重命名/移动 os.rename(old, new) 也可实现跨目录移动

5.3 判断存在性

os.path.isdir(p)    # 是目录且存在 → True
os.path.isfile(p)   # 是文件且存在 → True(兼容 / 和 \ 分隔符)
os.path.exists(p)   # 文件或目录,存在即 True

5.4 路径拼接与解析

os.path.join('D:\\my_project', 'D', 'E')      # 自动按系统分隔符拼接
os.path.basename('D:/my_project/abcabc.py')   # 取最后一级 → 'abcabc.py'

6. shutil 模块 —— 高级文件操作

import shutil
shutil.rmtree("D:/my_project/a")   # 递归删除目录及其下所有文件
                                   # 等价于 Linux 的 rm -rf ./a

WARNING os.rmdir vs shutil.rmtree

  • os.rmdir / os.removedirs:只能删目录
  • shutil.rmtree:目录非空也直接连锅端,慎用!

7. json 模块 —— 序列化与反序列化

7.1 核心概念

  • 序列化:Python 数据类型 → JSON 格式字符串(json.dumps
  • 反序列化:JSON 字符串 → Python 数据类型(json.loads
  • JSON 整体就是一个字符串;键和字符串值必须用双引号[] 叫数组(不叫列表)
import json
jj = {"name": "陈冠希", "age": 20, "bobby": ["", "演戏", "拍视频"]}
 
j_json = json.dumps(jj)      # dict → JSON 字符串(序列化)
type(j_json)                 # <class 'str'>
 
dict_jj = json.loads(j_json) # JSON 字符串 → dict(反序列化)
dict_jj["name"]              # '陈冠希'

7.2 类型映射与大小写陷阱

Python JSON
dict object {}
list / tuple array []
str string(双引号)
int / float number
True / False true / false全小写
None null
jj = '{"name":"陈冠希","age":20,"is_ok":true}'   # ✅ true 小写才合法
json.loads(jj)   # 若写成 True 会解析报错

7.3 写入文件

with open('json001.json', 'w') as f:
    f.write(j_json)          # 把序列化后的字符串写入文件
# 也可直接用 json.dump(jj, f),一步到位

TIP 记忆口诀 dumps / loadss → 操作字符串(str)dump / load 不带 s → 直接操作文件对象